From 0b062b25e13922113d4a12a8639ade44d24736a2 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Thu, 3 May 2007 14:01:19 -0600 Subject: [PATCH] [IA64] Always insert entry to VHPT's head, or double TLB miss occurs. Always insert entry to VHPT head, or TLB miss will occur again although the translation exists in its collision chain. Signed-off-by: Zhang xiantao Signed-off-by: Anthony Xu --- xen/arch/ia64/vmx/vtlb.c | 46 +++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/xen/arch/ia64/vmx/vtlb.c b/xen/arch/ia64/vmx/vtlb.c index a7aa608471..d9efe5dad1 100644 --- a/xen/arch/ia64/vmx/vtlb.c +++ b/xen/arch/ia64/vmx/vtlb.c @@ -150,33 +150,41 @@ static void vmx_vhpt_insert(thash_cb_t *hcb, u64 pte, u64 itir, u64 ifa) tag = ia64_ttag(ifa); cch = head; while (cch) { - if (INVALID_VHPT(cch)) { - len = cch->len; - cch->page_flags = pte; - cch->len = len; - cch->itir = rr.ps << 2; - cch->etag = tag; - return; - } + if (INVALID_VHPT(cch)) + break; cch = cch->next; } - - if(head->len>=MAX_CCN_DEPTH){ - thash_recycle_cch(hcb, head); - cch = cch_alloc(hcb); + if (cch) { + if (cch == head) { + len = head->len; + } else { + local_irq_disable(); + cch->page_flags = head->page_flags; + cch->itir = head->itir; + cch->etag = head->etag; + len = head->len; + local_irq_enable(); + } } else{ - cch = __alloc_chain(hcb); + if (head->len >= MAX_CCN_DEPTH) { + thash_recycle_cch(hcb, head); + cch = cch_alloc(hcb); + } else { + cch = __alloc_chain(hcb); + } + local_irq_disable(); + *cch = *head; + head->next = cch; + len = cch->len+1; + cch->len = 0; + local_irq_enable(); } - local_irq_disable(); - *cch = *head; + head->page_flags=pte; + head->len = len; head->itir = rr.ps << 2; head->etag=tag; - head->next = cch; - head->len = cch->len+1; - cch->len = 0; - local_irq_enable(); return; } -- 2.30.2